package com.wolfword.common.util.object;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 字符串工具类
 * @author ServerZhang
 * @date 2017年11月30日
 */
public class StringUtil {
	
	/**
	 * 判断N个对象中是否有空，只要有一个为空则返回true
	 * @param objects
	 * @return
	 * @author ServerZhang
	 * @date 2017年11月30日
	 */
	public static Boolean isEmpty(Object... objects){
		for(Object object : objects){
			if (null == object || "".equals(object.toString().trim())
                    || "null".equals(object.toString().trim())) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 将若干字符串连接成文件路径
	 * @param strings
	 * @return
	 * @author ServerZhang
	 * @date 2017年12月5日
	 */
	public static String connectAsFilePath(String ... strings ){
		StringBuffer stringBuffer = new StringBuffer();
		
		int length = strings.length;
		if (length < 1) {
			return "";
		}
		if (length == 1) {
			return strings[0].replaceAll("\\\\", "/");
		}
		
		for(int i=0; i<length-1; i++){
			String str1 = strings[i].replaceAll("\\\\", "/");
			String str2 = strings[i+1].replaceAll("\\\\", "/");
			stringBuffer.append(str1);
			if (!str1.endsWith("/") && !str2.startsWith("/")) {
				stringBuffer.append("/");
			}
			if (i == length-2) {
				stringBuffer.append(str2);
			}
		}
		
		return stringBuffer.toString();
	}
	/**
     * 把输入流里面的内容以UTF-8编码当文本取出。
     * @param streams
     * @return
     * @author ServerZhang
     * @date 2017年12月15日
     */
	@Deprecated
    public static String get4InputStream(InputStream... streams) {
    	if (null == streams) {
			return "";
		}
    	
    	StringBuilder result = new StringBuilder();
    	BufferedReader br = null;
    	String line = null;
    	for (InputStream is : streams) {
    		if (null == is) {
				continue;
			}
    		try {
				br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
				while ((line=br.readLine()) != null) {
					result.append(line);
				}
				is.close();
				br.close();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				try {
					is.close();
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
    	}
    	return result.toString();
    }
    /**
     * 把文件里面的内容以UTF-8编码当文本取出。
     * @param file
     * @return
     * @author ServerZhang
     * @date 2017年12月15日
     */
    public static String getText4File(File file) {
    	if (null == file && !file.exists()) {
    		return "";
    	}
    	FileInputStream fileInputStream = null;
    	
    	StringBuilder result = new StringBuilder();
    	BufferedReader br = null;
    	String line = null;
    	try {
    		fileInputStream = new FileInputStream(file);
    		br = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8"));
    		while ((line=br.readLine()) != null) {
    			result.append(line);
    		}
    		fileInputStream.close();
    		br.close();
    	} catch (FileNotFoundException e1) {
    		// TODO Auto-generated catch block
    		e1.printStackTrace();
    	} catch (UnsupportedEncodingException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}finally{
    		try {
    			fileInputStream.close();
    			br.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	return result.toString();
    }
    
    public static String getUUID(){
		UUID uuid = UUID.randomUUID();
		return String.valueOf(uuid).replace("-", "");
	}
    
    /**
	  * 获取字符串中的手机号码
	  * 
	  * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147 new:184、178
	  * 联通号码段:130、131、132、136、185、186、145
	  * 电信号码段:133、153、180、189 new :181、177、173
	 * @return
	 * @author ServerZhang
	 * @date 2018年1月15日
	 */
	public static List<String> getPhoneNos(String text){
		//String regexStr = "(\\D((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[3,7-8])|(18[0-9])))\\d{8}\\D";
		String regexStr = "\\D1\\d{10}\\D";
		List<String> strings = get4Regex(text, regexStr);
		List<String> result = new ArrayList<String>();
		Iterator<String> iterator = strings.iterator();
		while(iterator.hasNext()){
			String next = iterator.next();
			String newStr = null;
			int length = next.length();
			if (length == 11) {//首尾空格未匹配到字符串的情况
				newStr = next;
			}else if (length == 12) {//首部或尾部空格丢失
				if (next.endsWith("[0-9]")) {
					newStr = next.substring(1, next.length());
				}else {
					newStr = next.substring(0, next.length()-1);
				}
			}else if (length == 13) {//正常情况
				newStr = next.substring(1, next.length()-1);
			}else {//不可能的情况
				continue;
			}
			if (!result.contains(newStr)) {
				result.add(newStr);
			}
		}
		return result;
	}
	/**
	 * 获取字符串中的邮箱地址
	 * 
	 * @return
	 * @author ServerZhang
	 * @date 2018年1月15日
	 */
	public static List<String> getEmails(String text){
		String regexStr = "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+";
		List<String> strings = get4Regex(text, regexStr);
		List<String> result = new ArrayList<String>();
		Iterator<String> iterator = strings.iterator();
		while(iterator.hasNext()){
			String next = iterator.next();
			if (!result.contains(next)) {
				result.add(next);
			}
		}
		return result;
	}
	/**
	 * 获取字符串中的职称
	 * 包括：讲师、副教授、教授、中级工程师、高级工程师
	 * @return
	 * @author ServerZhang
	 * @date 2018年1月15日
	 */
	public static List<String> getTitles(String text){
		
		String regexStr = "(讲师)|(副教授)|(教授)|(中级工程师)|(高级工程师)";
		List<String> strings = get4Regex(text, regexStr);
		List<String> result = new ArrayList<String>();
		Iterator<String> iterator = strings.iterator();
		while(iterator.hasNext()){
			String next = iterator.next();
			if (!result.contains(next)) {
				result.add(next);
			}
		}
		return result;
	}
	
	/**
	 * 从文本中解析匹配正则表达式的文本段
	 * @param text
	 * @param regexStr
	 * @return
	 * @author ServerZhang
	 * @date 2017年10月27日
	 */
	private static List<String> get4Regex(String text, String regexStr){
		List<String> resultStrs = new ArrayList<String>();
		Pattern compile = Pattern.compile(regexStr);
		Matcher matcher = compile.matcher(text);
		while(matcher.find()){
			resultStrs.add(matcher.group());
		}
		return resultStrs;
	}
	
	/*public static void main(String[] args){
		File file = new File("D:/03WorkSpace_luna/crawler/spring-boot/htmls/scu_edu_cn/3/1/6/test.html");
		FileInputStream fis;
		FileReader fReader;
		BufferedReader bReader;
		DataInputStream dis;
		String readUTF = null;
		StringBuffer sbBuffer = new StringBuffer();
		try {
			fReader = new FileReader(file);
			bReader = new BufferedReader(fReader);
			String readLine = bReader.readLine();
			while (readLine != null) {
				sbBuffer.append(readLine);
				readLine = bReader.readLine();
			}
			readUTF = sbBuffer.toString();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		
		
		String text = "/gj.scu.edu.cn/natong/natongjiang/ 15114574111994.html 13495123012 f13495123012，,13495112012，     594962949@qq.com  ,he   中级工程师    13495112012s教授lafj 是safw fdsa中魂牵梦萦高级工程师";
		List<String> phoneNos = getPhoneNos(readUTF);
		List<String> emails = getEmails(readUTF);
		List<String> titles = getTitles(readUTF);
		System.out.println("手机号数量："+phoneNos.size());
		for(String string : phoneNos){
			System.out.println(string);
		}
		System.out.println("邮箱数量："+emails.size());
		for(String string : emails){
			System.out.println(string);
		}
		System.out.println("职称数量："+titles.size());
		for(String string : titles){
			System.out.println(string);
		}
	}*/
}
